# -*- coding: utf-8 -*-
# author='xuyinghao'

"""
不用加减法乘除做加法
"""

"""
思路:
步骤1：按位与是看两个数哪些二进制为1，这些都是进位位，结果需要左移一位，表示进位后的结果。
步骤2：按位异或是看两个数哪些二进制只有一个1，这些是非进位位，可以加，减，结果表示非进位位
进行加操作后的结果
"""

"""

首先看十进制是如何做的： 5+7=12，三步走
第一步：相加各位的值，不算进位，得到2。
第二步：计算进位值，得到10. 如果这一步的进位值为0，那么第一步得到的值就是最终结果。

第三步：重复上述两步，只是相加的值变成上述两步的得到的结果2和10，得到12。

同样我们可以用三步走的方式计算二进制值相加： 5-101，7-111 第一步：相加各位的值，不算进位，得到010，二进制每位相加就相当于各位做异或操作，101^111。

第二步：计算进位值，得到1010，相当于各位做与操作得到101，再向左移一位得到1010，(101&111)<<1。

第三步重复上述两步， 各位相加 010^1010=1000，进位值为100=(010&1010)<<1。
     继续重复上述两步：1000^100 = 1100，进位值为0，跳出循环，1100为最终结果。
"""


class Solution:
	def function(self,num1,num2):
		while num2 !=0:
			sum = num1 ^ num2
			carry = (num1 & num2)<<1
			num1 = sum
			num2 = carry
		return  num1


s =Solution()
print(s.function(5,7))

